02 sys模块
你写的Python代码跑在Python解释器里,sys模块就是你和解释器"对话"的窗口——获取解释器版本、读取命令行参数、修改模块搜索路径、控制程序退出……这些都得靠sys。
和builtins一样,sys也是自动可用的,不需要import。但按照惯例,还是建议在文件开头写上import sys,让代码更清晰。
一、系统信息
1.1 版本相关
python
import sys
# Python版本字符串
sys.version
# '3.14.0 (main, Jun 13 2026, 10:00:00) [GCC 11.4.0]'
# 版本信息元组
sys.version_info
# sys.version_info(major=3, minor=14, micro=0, releaselevel='final', serial=0)
# 常用:检查Python版本
if sys.version_info >= (3, 11):
print("支持3.11+特性")
# 解释器路径
sys.executable
# '/usr/bin/python3'1.2 平台信息
python
# 操作系统平台
sys.platform
# 'linux' / 'darwin' / 'win32'
# 根据平台执行不同代码
if sys.platform == "win32":
print("Windows系统")
elif sys.platform == "darwin":
print("macOS系统")
elif sys.platform == "linux":
print("Linux系统")
# 路径分隔符
sys.prefix # 安装前缀
sys.exec_prefix # 可执行文件前缀1.3 内存与限制
python
# 对象占用的内存大小(字节)
sys.getsizeof(0) # 28
sys.getsizeof("") # 49
sys.getsizeof([]) # 56
sys.getsizeof({}) # 64
# 最大整数值
sys.maxsize # 9223372036854775807
# 浮点数信息
sys.float_info
# sys.float_info(max=1.7976931348623157e+308, max_exp=1024, ...)二、命令行参数
2.1 sys.argv
sys.argv是一个列表,包含了命令行参数。argv[0]是脚本名,后面依次是传入的参数。
python
# app.py
import sys
print(f"脚本名: {sys.argv[0]}")
print(f"参数列表: {sys.argv[1:]}")
print(f"参数个数: {len(sys.argv) - 1}")运行:
bash
python app.py hello world 123输出:
脚本名: app.py
参数列表: ['hello', 'world', '123']
参数个数: 32.2 解析命令行参数
python
# agent_cli.py
import sys
def main():
if len(sys.argv) < 2:
print("用法: python agent_cli.py <query>")
sys.exit(1)
query = sys.argv[1]
if "--verbose" in sys.argv:
print(f"调试模式: query={query}")
print(f"Agent收到查询: {query}")
if __name__ == "__main__":
main()实际项目中,建议用argparse模块来处理命令行参数,它更强大也更规范。
三、模块搜索路径
3.1 sys.path
sys.path是一个列表,Python在import模块时会按顺序搜索这些路径。
python
import sys
for path in sys.path:
print(path)
# /Users/apple/project
# /usr/lib/python3.14
# /usr/lib/python3.14/lib-dynload
# /usr/lib/python3.14/site-packages
# ...3.2 动态添加模块路径
python
import sys
# 添加自定义模块路径
sys.path.append("/opt/my_modules")
sys.path.insert(0, "./libs") # 插入到最前面,优先搜索
# 现在可以import这些路径下的模块
import my_custom_module3.3 已加载模块
python
import sys
# 查看当前已加载的所有模块
print(sys.modules.keys())
# 检查某个模块是否已加载
if "numpy" in sys.modules:
print("numpy已加载")四、标准流
4.1 标准输入/输出/错误
python
import sys
# 标准输入(默认是键盘)
sys.stdin
# 标准输出(默认是终端)
sys.stdout
# 标准错误(默认是终端,但不会被重定向)
sys.stderr4.2 重定向输出
python
import sys
# 临时重定向stdout到文件
with open("output.txt", "w") as f:
old_stdout = sys.stdout
sys.stdout = f
print("这行内容会写入文件")
sys.stdout = old_stdout
# 更优雅的方式:用contextlib.redirect_stdout
from contextlib import redirect_stdout
with open("output.txt", "w") as f:
with redirect_stdout(f):
print("这行内容会写入文件")4.3 直接写入stderr
python
import sys
# print()默认写入stdout
print("普通输出")
# 错误信息应该写入stderr
print("错误信息", file=sys.stderr)
# 或者用stderr.write()
sys.stderr.write("错误信息\n")五、程序控制
5.1 sys.exit()
退出Python程序。
python
import sys
def check_config():
if not config_exists():
print("配置文件不存在,程序退出")
sys.exit(1) # 非零状态码表示异常退出
# 状态码约定
# 0: 正常退出
# 1: 一般错误
# 2: 语法错误
# 其他: 自定义错误sys.exit()实际上是抛出SystemExit异常,可以被捕获:
python
try:
sys.exit(1)
except SystemExit as e:
print(f"程序尝试退出,状态码: {e.code}")5.2 sys.exc_info()
获取当前正在处理的异常信息。
python
import sys
try:
1 / 0
except:
exc_type, exc_value, exc_tb = sys.exc_info()
print(f"异常类型: {exc_type}") # <class 'ZeroDivisionError'>
print(f"异常值: {exc_value}") # division by zero
print(f"追踪对象: {exc_tb}") # <traceback object>六、环境与编码
6.1 默认编码
python
import sys
# 默认编码(通常是utf-8)
sys.getdefaultencoding() # 'utf-8'
# 文件系统编码
sys.getfilesystemencoding() # 'utf-8' (Linux/macOS) / 'utf-8' (Windows)6.2 递归限制
python
import sys
# 查看最大递归深度
sys.getrecursionlimit() # 默认1000
# 修改递归限制(谨慎使用)
sys.setrecursionlimit(5000)6.3 字节序
python
import sys
# 本机字节序
sys.byteorder # 'little' (x86/x64) 或 'big' (某些嵌入式)七、实用技巧
7.1 判断运行环境
python
import sys
# 判断是否在交互式环境
if hasattr(sys, 'ps1'):
print("在交互式Python中运行")
else:
print("在脚本中运行")
# 判断是否被冻结(py2exe、PyInstaller等)
if getattr(sys, 'frozen', False):
print("打包后的程序")
else:
print("正常Python环境")7.2 获取调用栈信息
python
import sys
def func_a():
func_b()
def func_b():
# 获取当前调用栈
frame = sys._getframe(0) # 当前帧
print(f"当前函数: {frame.f_code.co_name}")
frame = sys._getframe(1) # 调用者帧
print(f"调用者: {frame.f_code.co_name}")
func_a()
# 当前函数: func_b
# 调用者: func_a7.3 检查Python实现
python
import sys
# 当前Python实现信息
sys.implementation
# namespace(cache_tag='cpython-314', hexversion=51243760, name='cpython', ...)
if sys.implementation.name == "cpython":
print("标准CPython")
elif sys.implementation.name == "pypy":
print("PyPy实现")八、总结
sys模块的核心就是让你操控Python解释器:
| 分类 | 常用属性/函数 |
|---|---|
| 系统信息 | version, version_info, platform, executable |
| 内存 | getsizeof(), maxsize, float_info |
| 命令行 | argv |
| 模块管理 | path, modules |
| 标准流 | stdin, stdout, stderr |
| 程序控制 | exit(), exc_info(), getrecursionlimit() |
| 编码 | getdefaultencoding(), byteorder |
sys模块在写CLI工具、调试程序、处理跨平台兼容性时特别有用。记住sys.argv、sys.path、sys.exit()这三个用得最多就行。